package models

import (
	"context"
	"errors"
	"go-chain-api/global"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"strconv"
)

type Withdraw struct {
	Id            string `bson:"_id,omitempty" json:"id"`
	UserId        string `bson:"userId" json:"userId"`
	TokenId       string `bson:"tokenId" json:"tokenId"`
	TokenSymbol   string `bson:"tokenSymbol" json:"tokenSymbol"`
	BusinessId    uint   `bson:"businessId" json:"businessId"`
	TxHash        string `bson:"txHash" json:"txHash"`
	From          string `bson:"from" json:"from"`
	To            string `bson:"to" json:"to"`
	Value         string `bson:"value" json:"value"`
	CallBack      string `bson:"callBack" json:"callBack"`
	Memo          string `bson:"memo" json:"memo"`
	ChainId       uint   `bson:"chainId" json:"chainId"`
	Timestamp     uint   `bson:"timestamp" json:"timestamp"`
	Status        uint   `bson:"status" json:"status"` //0待审核   1审核通过  2审核驳回  3交易成功  4交易失败
	ChainName     string `bson:"chainName" json:"chainName"`
	TokenAddress  string `bson:"tokenAddress" json:"tokenAddress"`
	TokenDecimals uint   `bson:"tokenDecimals" json:"tokenDecimals"`
	MainCoinType  int64  `bson:"mainCoinType" json:"mainCoinType"`
}

type CallBackBody struct {
	Address      string `json:"address"`      // 地址
	Amount       string `json:"amount"`       // 金额   wei
	BlockHigh    string `json:"blockHigh"`    //块高度
	CoinType     string `json:"coinType"`     //代币id
	Decimals     int    `json:"decimals"`     //精度
	Fee          int    `json:"fee"`          //手续费   wei
	MainCoinType string `json:"mainCoinType"` //主币id
	Status       int    `json:"status"`       //状态0	待审核 1	审核成功 2	审核驳回 3	交易成功 4	交易失敗
	TradeId      string `json:"tradeId"`      //流水号
	TradeType    int    `json:"tradeType"`    //1	充币回调 2	提币回调
	TxId         string `json:"txId"`         //交易哈希
	BusinessId   string `json:"businessId"`   //业务编号  提币回调用
	Memo         string `json:"memo"`         //备注

}

type WithdrawRequestData struct {
	Id     string `bson:"id" json:"id"`
	Status uint   `bson:"status" json:"status"`
	Memo   string `bson:"memo" json:"memo"`
}

func RepeatWithdraw(businessId string, userId string, tokenAddress string) bool {
	var withdraw Withdraw
	withdrawClient := global.DBEngine.Database(global.DbConfig.DbName).Collection("withdraw")
	businessInt, _ := strconv.Atoi(businessId)
	filter := bson.M{
		"$and": []bson.M{
			{"businessId": businessInt},
			{"userId": userId},
			{"tokenAddress": tokenAddress},
			{
				"$or": []bson.M{
					{"status": 0},
					{"status": 1},
					{"status": 3},
				},
			},
		},
	}
	err := withdrawClient.FindOne(context.Background(), filter).Decode(&withdraw)
	if !errors.Is(err, mongo.ErrNoDocuments) && withdraw.TxHash != "" {
		return false
	}
	return true
}
